﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Itfort.UserCenter
{
	/// <summary>
	/// 用户服务接口。
	/// </summary>
	public interface IUserService
	{
		/// <summary>
		/// 创建用户。
		/// </summary>
		/// <param name="username">用户名。</param>
		/// <param name="password">密码。</param>
		/// <param name="email">电子邮箱。</param>
		/// <returns>新创建的用户的信息填充的User对象。</returns>
		/// <exception cref="UCExceiption"></exception>
		User CreateUser(String username, String password, String email);

		/// <summary>
		/// 创建用户。
		/// </summary>
		/// <param name="email">电子邮箱。</param>
		/// <param name="password">密码。</param>
		/// <returns>新创建的用户的信息填充的User对象。</returns>
		/// <exception cref="UCExceiption"></exception>
		User CreateUserByEmail(String email, String password);

		/// <summary>
		/// 创建用户。
		/// </summary>
		/// <param name="mobile">手机号码。</param>
		/// <param name="password">密码。</param>
		/// <returns>新创建的用户的信息填充的User对象。</returns>
		/// <exception cref="UCExceiption"></exception>
		User CreateUserByMobile(String mobile, String password);

		/// <summary>
		/// 获取用户。
		/// </summary>
		/// <param name="username">用户名。</param>
		/// <returns>一个User对象，它表示指定的用户。</returns>
		User GetUser(String username);

		/// <summary>
		/// 获取用户。
		/// </summary>
		/// <param name="email">电子邮箱。</param>
		/// <returns>一个User对象，它表示指定的用户。</returns>
		User GetUserByEmail(String email);

		/// <summary>
		/// 获取用户。
		/// </summary>
		/// <param name="mobile">手机号码。</param>
		/// <returns>一个User对象，它表示指定的用户。</returns>
		User GetUserByMobile(String mobile);

		/// <summary>
		/// 获取用户集合。
		/// </summary>
		/// <param name="pageIndex">页索引。</param>
		/// <param name="pageSize">页大小。</param>
		/// <returns>User对象集合。</returns>
		IList<User> GetUsers(Int32 pageIndex, Int32 pageSize);

		/// <summary>
		/// 获取用户数量。
		/// </summary>
		/// <returns>用户数量。</returns>
		Int32 GetCount();

		/// <summary>
		/// 获取用户集合，匹配用户名。
		/// </summary>
		/// <param name="username">要匹配的用户名。</param>
		/// <param name="pageIndex">页索引。</param>
		/// <param name="pageSize">页大小。</param>
		/// <returns>User对象集合。</returns>
		IList<User> FindUsers(String username, Int32 pageIndex, Int32 pageSize);

		/// <summary>
		/// 获取用户集合，匹配电子邮箱。
		/// </summary>
		/// <param name="email">电子邮箱。</param>
		/// <param name="username">要匹配的用户名。</param>
		/// <param name="pageIndex">页索引。</param>
		/// <param name="pageSize">页大小。</param>
		/// <returns>User对象集合。</returns>
		IList<User> FindUsersByEmail(String email, Int32 pageIndex, Int32 pageSize);

		/// <summary>
		/// 获取用户集合，匹配手机号码。
		/// </summary>
		/// <param name="mobile">手机号码。</param>
		/// <param name="username">要匹配的用户名。</param>
		/// <param name="pageIndex">页索引。</param>
		/// <param name="pageSize">页大小。</param>
		/// <returns>User对象集合。</returns>
		IList<User> FindUsersByMobile(String mobile, Int32 pageIndex, Int32 pageSize);

		/// <summary>
		/// 验证用户名和密码是否有效。
		/// </summary>
		/// <param name="username">用户名。</param>
		/// <param name="password">密码。</param>
		/// <returns>如果有效，返回true；否则返回false。</returns>
		Boolean ValidateUser(String username, String password);

		/// <summary>
		/// 验证电子邮箱和密码是否有效。
		/// </summary>
		/// <param name="email">电子邮箱</param>
		/// <param name="password">密码。</param>
		/// <returns>如果有效，返回true；否则返回false。</returns>
		/// <exception cref="UCExceiption">未开启电子邮箱登陆。</exception>
		Boolean ValidateUserByEmail(String email, String password);

		/// <summary>
		/// 验证手机号码和密码是否有效。
		/// </summary>
		/// <param name="email">手机号码。</param>
		/// <param name="password">密码。</param>
		/// <returns>如果有效，返回true；否则返回false。</returns>
		/// <exception cref="UCExceiption">为开启手机号码登陆。</exception>
		Boolean ValidateuserByMobile(String email, String password);

		/// <summary>
		/// 核对用户名合法性。
		/// </summary>
		/// <param name="username">被核对的用户名。</param>
		/// <param name="errorCode">
		/// 当此方法返回时，如果结果为false，则设置对应的错误代码；否则返回null。
		/// </param>
		/// <returns>
		/// 如果用户名合法，则返回true；否则返回false。
		/// </returns>
		Boolean CheckUserName(String username, out ErrorCode errorCode);

		/// <summary>
		/// 核对电子邮箱合法性。
		/// </summary>
		/// <param name="email">被核对的电子邮箱。</param>
		/// <param name="errorCode">
		/// 当此方法返回时，如果结果为false，则设置对应的错误代码；否则返回null。
		/// </param>
		/// <returns>
		/// 如何电子邮箱合法，则返回true；否则返回false。
		/// </returns>
		Boolean CheckEmail(String email, out ErrorCode errorCode);

		/// <summary>
		/// 核对手机号码合法性。
		/// </summary>
		/// <param name="mobile">被核对的手机号码。</param>
		/// <param name="errorCode">
		/// 当此方法返回时，如果结果为false，则设置对应的错误代码；否则返回null。
		/// </param>
		/// <returns>
		/// 如何电子手机号码，则返回true；否则返回false。
		/// </returns>
		Boolean CheckMobile(String mobile, out ErrorCode errorCode);

		/// <summary>
		/// 用户名是否存在。
		/// </summary>
		/// <param name="username">要检查的用户名。</param>
		/// <returns>如果存在，则返回true；否则返回false。</returns>
		Boolean ExistsUserName(String username);

		/// <summary>
		/// 电子邮箱是否存在。
		/// </summary>
		/// <param name="username">要检查的电子邮箱。</param>
		/// <returns>如果存在，则返回true；否则返回false。</returns>
		Boolean ExistsEmail(String email);

		/// <summary>
		/// 手机号码是否存在。
		/// </summary>
		/// <param name="username">要检查的手机号码。</param>
		/// <returns>如果存在，则返回true；否则返回false。</returns>
		Boolean ExistsMobile(String mobile);
	}
}
